#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mapChar.h"

int isMapaCharVazio(MapaChar L) {
	return (L.Primeiro->prox == NULL);
}

void criaMapaChar(MapaChar *L) {

	L->Primeiro = (PItemMapa)malloc(sizeof(ItemMapa));
	L->Ultimo = (PItemMapa)malloc(sizeof(ItemMapa));
    L->Primeiro->prox = NULL;
	L->Ultimo->prox = NULL;
}

void inserirItemCaracter(MapaChar *L, PItemMapa a) {

	if (isMapaCharVazio(*L))
		L->Primeiro->prox = a;
	else {
		L->Ultimo->prox->prox = a;
	}
	L->Ultimo->prox = a;
	a->prox = NULL;
}

void putCaracter(MapaChar *L, char chave, int valor) {

	PItemMapa a = (PItemMapa) malloc(sizeof(ItemMapa));

	if (getValor(L,chave) == -1) {

		ChaveValor item;
		item.chave = chave;
		item.valor = valor;
		a->chaveValor = item;

		inserirItemCaracter(L, a);

	} else {

		PItemMapa aux = L->Primeiro->prox;
		while (aux != NULL) {

			if (aux->chaveValor.chave == chave) {
				aux->chaveValor.valor = valor;
				break;
			}

			aux = aux->prox;
		}
	}

}

int getValor(MapaChar *L, char chave) {

	int valor = -1;
	PItemMapa aux = L->Primeiro->prox;
	while (aux != NULL)
	{
		if(aux->chaveValor.chave == chave) {
			valor = aux->chaveValor.valor;
		}
		aux = aux->prox;
	}

	return valor;
}

void removerCaracter(MapaChar *L, char chave) {

	PItemMapa aux = L->Primeiro->prox;
	while (aux != NULL) {

		if(aux->chaveValor.chave == chave) {
			aux->chaveValor.valor = -1;
		}

		aux = aux->prox;
	}
}

void imprimirMapaChar(MapaChar L) {

	PItemMapa aux = L.Primeiro->prox;
	while (aux != NULL) {

		if(aux->chaveValor.valor != -1) {
			printf("\n");
			printf("Chave: %c", aux->chaveValor.chave);
			printf("\t Valor: %d", aux->chaveValor.valor);
		}

		aux = aux->prox;
	}

}

int contarCaracteres(MapaChar L) {

	int retorno = 0;
	PItemMapa aux = L.Primeiro->prox;
	while (aux != NULL) {

		if(aux->chaveValor.valor != -1) {
			retorno++;
		}

		aux = aux->prox;
	}
	return retorno;

}

char *palavraCaracter(MapaChar L) {

	int tam = contarCaracteres(L);
	char *retorno = (char*)malloc(tam);
	int i = 0;
	PItemMapa aux = L.Primeiro->prox;
	while (aux != NULL) {

		if (aux->chaveValor.valor != -1) {
			retorno[i] = aux->chaveValor.chave;
			i++;
		}

		aux = aux->prox;
	}

	return retorno;
}

void liberaMapaChar(MapaChar L) {

	PItemMapa p = L.Primeiro->prox;
	while (p != NULL) {
		PItemMapa t = p->prox;
		free(p);
		p = t;
	}
}
